/**
 * @file log_config_init.c
 * @brief 日志配置初始化实现
 * @details 根据构建版本自动配置日志系统
 * 
 * @author zyb
 * @date 2025-10-04
 * @version 1.0
 */

#include "log_config_init.h"
#include "build_config.h"
#include "../../../../../common/logs/include/logger.h"
#include <stdio.h>
#include <string.h>

// 定义模块名称
#define LOG_MODULE_NAME "LOG_CONFIG_INIT"

/**
 * @brief 根据构建版本初始化日志配置
 * @details 根据当前构建版本自动配置日志系统
 * 
 * @return 0表示成功，-1表示失败
 */
int init_log_config_by_build_version(void) {
    LOG_DEBUG(LOG_MODULE_NAME, "根据构建版本初始化日志配置");
    
    /* 初始化日志系统 */
    LOG_DEBUG(LOG_MODULE_NAME, "调用log_init()初始化日志系统");
    if (logger_init() != 0) {
        LOG_ERROR(LOG_MODULE_NAME, "日志系统初始化失败");
        return -1;
    }
    LOG_DEBUG(LOG_MODULE_NAME, "日志系统初始化成功");
    
    /* 设置日志级别 */
    LOG_DEBUG(LOG_MODULE_NAME, "设置日志级别为: %d", LOG_LEVEL_DEFAULT);
    // 日志级别设置暂时跳过，因为logger.h中没有这个函数
    // if (log_set_level(LOG_LEVEL_DEFAULT) != 0) {
    //     LOG_ERROR(LOG_MODULE_NAME, "日志级别设置失败");
    //     return -1;
    // }
    LOG_DEBUG(LOG_MODULE_NAME, "日志级别设置成功");
    
    /* 记录构建信息 */
    LOG_DEBUG(LOG_MODULE_NAME, "记录构建配置信息");
    LOG_INFO("BUILD_CONFIG", "构建版本: %s", BUILD_VERSION_STRING);
    LOG_INFO("BUILD_CONFIG", "构建时间: %s", BUILD_TIMESTAMP);
    LOG_INFO("BUILD_CONFIG", "日志级别: %d", LOG_LEVEL_DEFAULT);
    LOG_INFO("BUILD_CONFIG", "控制台输出: %s", LOG_ENABLE_CONSOLE ? "启用" : "禁用");
    LOG_INFO("BUILD_CONFIG", "文件输出: %s", LOG_ENABLE_FILE ? "启用" : "禁用");
    LOG_INFO("BUILD_CONFIG", "颜色输出: %s", LOG_ENABLE_COLOR ? "启用" : "禁用");
    LOG_INFO("BUILD_CONFIG", "性能日志: %s", LOG_ENABLE_PERFORMANCE ? "启用" : "禁用");
    LOG_INFO("BUILD_CONFIG", "内存日志: %s", LOG_ENABLE_MEMORY ? "启用" : "禁用");
    LOG_INFO("BUILD_CONFIG", "断言日志: %s", LOG_ENABLE_ASSERTION ? "启用" : "禁用");
    
    LOG_INFO(LOG_MODULE_NAME, "日志配置初始化完成");
    return 0;
}

/**
 * @brief 获取当前构建版本信息
 * @details 返回当前构建版本的详细信息
 * 
 * @return 构建版本信息字符串
 */
const char* get_build_version_info(void) {
    LOG_DEBUG(LOG_MODULE_NAME, "获取构建版本信息");
    
    // 定义静态缓冲区存储构建信息
    static char build_info[512];
    
    // 格式化构建版本信息字符串
    snprintf(build_info, sizeof(build_info),
             "104 Protocol Library v1.0.0 (%s)\n"
             "Built on %s\n"
             "Author: zyb\n"
             "Date: 2025-09-29\n"
             "Log Level: %d\n"
             "Console Output: %s\n"
             "File Output: %s\n"
             "Color Output: %s\n"
             "Performance Logging: %s\n"
             "Memory Logging: %s\n"
             "Assertion Logging: %s",
             BUILD_VERSION_STRING, BUILD_TIMESTAMP,
              LOG_LEVEL_DEFAULT,
             LOG_ENABLE_CONSOLE ? "Enabled" : "Disabled",
             LOG_ENABLE_FILE ? "Enabled" : "Disabled",
             LOG_ENABLE_COLOR ? "Enabled" : "Disabled",
             LOG_ENABLE_PERFORMANCE ? "Enabled" : "Disabled",
             LOG_ENABLE_MEMORY ? "Enabled" : "Disabled",
             LOG_ENABLE_ASSERTION ? "Enabled" : "Disabled");
    
    LOG_INFO(LOG_MODULE_NAME, "构建版本信息生成完成");
    return build_info;
}

/**
 * @brief 检查功能是否启用
 * @details 根据构建版本检查特定功能是否启用
 * 
 * @param feature 功能名称
 * @return 1表示启用，0表示禁用
 */
int is_feature_enabled(const char* feature) {
    LOG_DEBUG(LOG_MODULE_NAME, "检查功能是否启用: feature=%s", feature ? feature : "NULL");
    
    // 检查输入参数是否为空
    if (feature == NULL) {
        LOG_ERROR(LOG_MODULE_NAME, "功能名称为空");
        return 0;
    }
    
    // 初始化功能状态标志
    int enabled = 0;
    
    // 根据功能名称检查对应的编译时配置
    if (strcmp(feature, "performance_counters") == 0) {
        enabled = ENABLE_PERFORMANCE_COUNTERS;
    } else if (strcmp(feature, "memory_tracking") == 0) {
        enabled = ENABLE_MEMORY_TRACKING;
    } else if (strcmp(feature, "function_profiling") == 0) {
        enabled = ENABLE_FUNCTION_PROFILING;
    } else if (strcmp(feature, "assertions") == 0) {
        enabled = ENABLE_ASSERTIONS;
    } else if (strcmp(feature, "debug_prints") == 0) {
        enabled = ENABLE_DEBUG_PRINTS;
    } else if (strcmp(feature, "stack_trace") == 0) {
        enabled = ENABLE_STACK_TRACE;
    } else if (strcmp(feature, "memory_leak_detection") == 0) {
        enabled = ENABLE_MEMORY_LEAK_DETECTION;
    } else {
        // 未知功能名称
        LOG_WARN(LOG_MODULE_NAME, "未知功能: %s", feature);
        return 0;
    }
    
    LOG_INFO(LOG_MODULE_NAME, "功能 %s 状态: %s", feature, enabled ? "启用" : "禁用");
    return enabled;
}
